RDSのMySQL/MariaDBでログをCloudWatch Logsへ出力可能になりました
ウィスキー、シガー、パイプをこよなく愛する大栗です。
先程RDSのMySQL/MariaDBのログファイルをCloudWatch Logsへ出力できる機能がリリースされましたのでレポートします。
- Monitor Amazon RDS for MySQL and MariaDB logs with Amazon CloudWatch
- Now Publish Log Files from Amazon RDS for MySQL and MariaDB to Amazon CloudWatch Logs
CloudWatch Logsへのログファイル出力
RDS for MySQL/MariaDBでは以下の4種類のログを出力することができました。
- Audit Log
- Error Log
- General Log
- Slow Query Log
出力先はテーブルかファイルとなり、テーブルの場合はDBにログインして内容を確認したり、ファイルの場合はAPI経由でファイルを取得したりと、Pullでログを見る必要がありました。今回のアップデートによりCloudWatch Logsへほぼリアルタイムに出力する事ができます。
CloudWatchへは以下の形式のロググループが生成されて、DBインスタンス名のログストリームにログが出力されます。
/aws/rds/instance/<db-instance-id>/<log-type>
試してみる
ここでは以下の環境とします。
- リージョン:東京
- DBエンジン:MariaDB 10.1.26
- 出力対象のログ
- Audit Log
- Error Log
- General Log
- Slow Query Log
パラメータの修正
CloudWatch Logsへログを出力するためには、そもそもファイルとしてログを出力している必要がありますので、そのための設定を行います。
パラメータグループ
MariaDB 10.1用のパラメータグループを作成して、以下のパラメータを修正します。
パラメータ設定 | 値 | 備考 |
---|---|---|
slow_query_log | 1 | 1でSlow Query Logを出力します。 |
general_log | 1 | 1でGeneral Logを出力します。 |
long_query_time | 0 | Slow Query Logの閾値(秒) |
log_output | FILE | ログをファイルとして出力します。 |
オプショングループ
監査ログの出力は以下のようにオプショングループでの設定が必要になります。
【新機能】Amazon RDSのMySQLとMariaDBで監査ログに対応。ついでにrdsadminの動作も確認してみた。
MariaDB 10.1用のオプショングループを作成してオプションの追加
をするとMARIADB_AUDIT_PLUGIN
を追加します。今回オプション設定はデフォルトの以下の内容です。
オプション設定 | 値 | 備考 |
---|---|---|
SERVER_AUDIT_EVENTS | CONNECT,QUERY | 監査する対象のイベントです。 |
SERVER_AUDIT_INCL_USERS | 監査対象とするユーザです。 | |
SERVER_AUDIT_EXCL_USERS | 監査対象外とするユーザです。 | |
SERVER_AUDIT_FILE_ROTATE_SIZE | ログファイルがローテーションするサイズ制限です。 | |
SERVER_AUDIT_FILE_ROTATIONS | 保存する世代数数です。 | |
SERVER_AUDIT_LOGGING | ON | ログが有効化を決めます。変更不能。 |
SERVER_AUDIT_FILE_PATH | /rdsdbdata/log/audit/ | ログファイルの場所です。変更不能。 |
SERVER_AUDIT | FORCE_PLUS_PERMANENT | この設定はセキュリティのために有効になっており、プラグイン実行時にアンインストールができないことを保証しています。変更不能。 |
DBインスタンスの起動
DBインスタンスを起動します。
ここではMariaDBを起動します。
MariaDBのバージョンはデフォルトの10.1.26を選択しました。
パラメータグループとオプショングループは事前に修正したものを使用します。
詳細設定にログのエクスポート
の項目が増えています。ここでCloudWatch Logsへ出力するログを選択します。ここでは以下の全部を選択しています。また、CloudWatch Logsへの出力権限はService Linked Roleで設定されます。
- 監査ログ
- エラーログ
- 全般ログ
- スロークエリログ
他はデフォルトの設定で起動します。
ログを確認する
CloudWatch Logsを確認すると以下の4種類のログが出力されたことが分かります。
- /aws/rds/instance/mariadb-1/audit
- /aws/rds/instance/mariadb-1/error
- /aws/rds/instance/mariadb-1/general
- /aws/rds/instance/mariadb-1/slowquery
各々のログは以下のように出力されます。
Audit Log
Error Log
General Log
Slow Query Log
ログを監視する
CloudWatch Logsに出力するだけでは面白くないので、ログインの失敗を監視してみます。
監視には以下のエントリのlogs2sns
を使用します。
ログイン失敗の監視は、RDSからCloudWatch Logsへ監査ログを出力して、Lambdaへストリームして内容を判断して、SNS経由でメールを送るという形になります。
logs2sns.yml
のCloudFormationテンプレートで以下の内容のパラメータを設定して起動します。
パラメータ | 設定内容 | 備考 |
---|---|---|
FilterPattern | /,FAILED_CONNECT,/ | 監視する正規表現 |
FilterPatternExcluded | /$^/ | 監視を除外する正規表現 |
MailSubject | MariaDB Login Failure | メールのタイトル |
NotifyTopicName | MariaDBNotifyTopic | SNSトピックの名前 |
log2snsのCloudFormationスタックを作成したら、作成したSNSトピックにメール通知を登録します。
CloudWatch Logsで監査ログである/aws/rds/instance/mariadb-1/audit
を選択して、Lambda サービスへのストリーミングの開始
を行います。
logs2snsで作成したLambda関数を選択します。
ログの形式はその他
にします。
内容を確認してストリーミングの開始
をクリックします。
これで設定は完了です。次はRDSへログインしてみます。
まずは普通にログインしてみます(パスワードはpassword
です)。特に何も起こりません。
$ mysql -u awsuser -pmypassword -h mariadb-1.abcdefghjik2.ap-northeast-1.rds.amazonaws.com mydb Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 32 Server version: 10.1.26-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [mydb]>
次に誤ったパスワードでログインしてみます。
$ mysql -u awsuser -pnotpassword -h mariadb-1.abcdefghjik2.ap-northeast-1.rds.amazonaws.com mydb ERROR 1045 (28000): Access denied for user 'awsuser'@'192.0.2.247' (using password: YES)
するとSNSのサブスクリプションとして登録していたメールアドレスにメールが届きます。
さいごに
Auroraでは監査ログについてCloudWatch Logsで出力できるようになっていましたが、MySQL/MariaDBでもCloudWatch Logsへ出力できるようになりました。CloudWatch LogsはLambdaやElasticsearch Serviceなどへストリーミングできるためログの活用の幅が広がります。
例えば、今回の例のようにログインの失敗検知や、Slow Query Logを元にRead Replicaの台数を増やすようなことも考えられます。CloudWatch Logsへの出力は他のDBエンジンにも広がる事を期待しています。